package {

	import flash.display.Graphics;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.filesystem.File;
	import flash.net.FileFilter;
	import flash.net.URLLoaderDataFormat;
	import flash.text.TextField;
	import flash.utils.ByteArray;

	import net.play5d.tool.swf_parse.Loger;
	import net.play5d.tool.swf_parse.SWFFile;
	import net.play5d.kyo.display.ui.KyoSimpButton;
	import net.play5d.kyo.loader.KyoURLoader;

	/* 嵌入描述应用程序各种信息的元数据 */
	[SWF(frameRate = 30, backgroundColor = "#FFFFFF", width = 800, height = 600)]
	public class Main extends Sprite {

		private var _swfFile:SWFFile;											// swf 字节数组

		private var _sp		:Sprite;											// 主容器
		private var _txt	:TextField;											// 日志文本

		private var _btns	:Array;												// 按钮组

		/**
		 * 构造函数
		 */
		public function Main():void {
			if (stage) {
				init();
			}
			else {
				addEventListener(Event.ADDED_TO_STAGE, init);
			}
		}

		/**
		 * 初始化
		 * 
		 * @param e Event
		 */
		private function init(e:Event = null):void {
			removeEventListener(Event.ADDED_TO_STAGE, init);

			stage.scaleMode = StageScaleMode.NO_SCALE;							// 设置舞台不缩放
			stage.align = StageAlign.TOP_LEFT;									// 设置舞台对齐方式为以左上角对齐
			stage.addEventListener(Event.RESIZE, resizeHandler);				// 每次窗口大小改变时重绘窗口

			_sp 	= new Sprite();
			_txt 	= new TextField();
			_btns 	= [];

			initUI();															// 初始化 UI

			resizeHandler();
		}

		/**
		 * 窗口变化侦听重绘器
		 * 
		 * @param e Event
		 */
		private function resizeHandler(e:Event = null):void {
			var w:Number = stage.nativeWindow.width;							// 获得当前窗口宽度
			var h:Number = stage.nativeWindow.height;							// 获得当前窗口高度
//			trace(w, h);

			var spGraphics:Graphics = _sp.graphics;								// 获得 _sp 精灵的图形类
			spGraphics.clear();													// 清除原本的图形
			spGraphics.beginFill(0xFFFFFF, 1);									// 定义填充类型为白色，透明度为 1
			spGraphics.drawRect(0, 0, w, h);									// 从 0, 0位置开始，以 w, h位置结束填充长方形
			spGraphics.endFill();												// 结束填充

			_txt.width = w;
			_txt.height = h - 80;												// 高度预留 80 像素给按钮区

			var len:uint = _btns.length;
			for (var i:uint = 0; i < len; i++) {								// 重绘每个按钮的位置
				var b:KyoSimpButton = _btns[i] as KyoSimpButton;
				if (b != null) {
					b.x = 10 + i * 120;
					b.y = h - 80;
				}
			}
		}

		/**
		 * 初始化 UI 界面
		 */
		private function initUI():void {
			Loger.init(_txt);

			addButton("选择文件");
			addButton("开始解析");

			_sp.addChild(_txt);
			addChild(_sp);														// 把主容器加入舞台列表

			Loger.log("SWF 解析器");
		}

		/**
		 * 添加按钮
		 * 
		 * @param label String
		 */
		private function addButton(label:String):void {
			var btn:KyoSimpButton = new KyoSimpButton(label, 100, 30);

			btn.name = label;
			btn.addEventListener(MouseEvent.CLICK, clickHandler);				// 给每个按钮都添加侦听
			_btns.push(btn);													// 加入到按钮列表

			_sp.addChild(btn);													// 加入到 _sp 显示列表
		}

		/**
		 * 点击事件
		 * 
		 * @param e MouseEvent
		 */
		private function clickHandler(e:MouseEvent):void {
			var btnName:String = (e.currentTarget as KyoSimpButton).name;

			switch (btnName) {
				case "选择文件":
					selectFile();
					break;
				case "开始解析":
					parse();
					break;
				default :
					Loger.log("未定义的按钮！");
			}
		}

		/**
		 * 选择文件
		 */
		private function selectFile():void {
			var file:File = new File();
			function selectHandler(e:Event):void {
				file.removeEventListener(Event.SELECT, selectHandler);

				var target:File = e.target as File;
				Loger.log(target.nativePath);

				if (_swfFile != null) {											// 如果有上次加载的数据
					_swfFile.destory();											// 销毁数据
					_swfFile = null;
				}
				loadSwf(target.nativePath);										// 载入 swf 数据
			}

			file.addEventListener(Event.SELECT, selectHandler);
			file.browseForOpen("选择一个 SWF 文件", [new FileFilter("SWF 文件", "*.swf")]);
		}

		/**
		 * 开始解析
		 */
		private function parse():void {
			if (_swfFile == null) {												// swf 数据为空，提示
				Loger.log("请先选择一个 SWF 文件作为解析目标！");

				return;
			}
			_swfFile.parseByte();												// 解析字节数组

			Loger.log(_swfFile);												// 输出
		}

		/**
		 * 载入 swf 文件
		 * 
		 * @param path String
		 */
		private function loadSwf(path:String):void {
			KyoURLoader.load(path, function(data:*):void {						// 调用	KyoURLoader.load() 方法，载入文件
				_swfFile = new SWFFile(data as ByteArray);
			}, null, {dataFormat: URLLoaderDataFormat.BINARY});					// 设置数据格式为二进制
		}
	}
}